package com.lpf.mybatis.statement;

import com.lpf.mybatis.config.Configuration;
import com.lpf.mybatis.config.MapperRegistry;
import com.lpf.mybatis.result.ResultSetHandler;

import java.sql.*;

/**
 * 数据库操作和结果处理分发
 */
@SuppressWarnings("all")
public class StatementHandler {

    private final Configuration configuration;
    private final ResultSetHandler resultSetHandler;

    public StatementHandler(Configuration configuration) {
        this.configuration = configuration;
        this.resultSetHandler = new ResultSetHandler(configuration);
    }

    /**
     * 功能描述：执行查询
     *
     * @param mapperData 根据 statementId 在 MapperRegistry 中找到的配置信息（sql、实体类型等）
     * @param parameter  设置到 sql 语句中的数据
     * @return E
     */
    public <E> E query(MapperRegistry.MapperData mapperData, Object parameter) throws Exception {

        // JDBC（获取数据库连接）
        Connection conn = getConnection();

        //StatementHandler --> 初始化ParameterHandler --> ResultSetHandler
        // TODO ParamenterHandler
        PreparedStatement pstmt = conn.prepareStatement(String.format(mapperData.getSql(), Integer.parseInt(String.valueOf(parameter))));
        // 执行数据库查询
        pstmt.execute();

        // ResultSetHandler（对返回的结果进行处理）
        return (E) resultSetHandler.handle(pstmt, mapperData);
    }

    /**
     * 功能描述：获取数据库连接（这里可以使用连接池）
     */
    public Connection getConnection() throws SQLException, ClassNotFoundException {

        String driver = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "root";

        Class.forName(driver); //classLoader,加载对应驱动

        return DriverManager.getConnection(url, username, password);
    }
}
